import { BaseModel } from '@/entity/base-model'
import { FormItemParams, FormItemProps } from '@/components/base/form-item/props'
import type { SelectProps, CascaderProps, TreeSelectProps } from 'ant-design-vue'
/**
 * 批量更新字段
 * @param target 原数组
 * @param fieldNames 字段名
 * @param type 更新类型 true 启用 false 禁用
 * @param keys 属性keys
 */
export function batchUpdateFields<Props extends BaseModel>(
  target: Array<FormItemProps<Props>>,
  fieldNames: Array<string>,
  type: any,
  keys: Array<keyof (FormItemProps & FormItemParams & { required?: boolean })>,
) {
  // @ts-ignore
  const val = target.filter((val) => fieldNames.includes(val.name))
  val.map((val: any) => {
    keys.forEach((key) => {
      val[key] = type
      if (val.params) {
        val.params[key] = type
      }
    })
    return val
  })
}

/**
 * 批量禁用字段
 * @param target 原数组
 * @param fieldNames 字段名
 * @param type 更新类型 true 启用 false 禁用
 */
export function batchUpdateDisabledFields<Props extends BaseModel>(
  target: Array<FormItemProps<Props>>,
  fieldNames: Array<string>,
  type = false,
) {
  batchUpdateFields(target, fieldNames, type, ['disabled'])
}

/**
 * 批量显示字段
 * @param target 原数组
 * @param fieldNames 字段名
 * @param type 更新类型 true 启用 false 禁用
 */
export function batchShowDisabledFields<Props extends BaseModel>(
  target: Array<FormItemProps<Props>>,
  fieldNames: Array<string>,
  type = false,
) {
  batchUpdateFields(target, fieldNames, type, ['show'])
}

/**
 * 批量必填字段
 * @param target 原数组
 * @param fieldNames 字段名
 * @param type 更新类型 true 必填 false 非必填
 */
export function batchUpdateRequiredFields<Props extends BaseModel>(
  target: Array<FormItemProps<Props>>,
  fieldNames: Array<string>,
  type = false,
) {
  batchUpdateFields(target, fieldNames, type, ['required'])
}

/**
 * 注入指定接口的更新选项
 * @param target 需要注入的原数组
 * @param field 注入字段名
 * @param api 接口方法
 * @param params 接口传入的参数
 * @param handleData 自定义处理数据的方法
 */
export async function injectCustomUpdateOptions<T extends BaseModel>(
  target: Array<FormItemProps<T>>,
  field: string,
  api: Function,
  handleData: (data: Array<T>) => Array<T> = (data) => data,
  params: object = {},
): Promise<void> {
  const prop = target.find((val) => val.name == field)?.params as SelectProps['options']
  if (prop) {
    const { data } = await api.apply(arguments, [params])
    // @ts-ignore
    prop.options = handleData ? handleData(data) : (data as any)
  }
}
/**
 * 注入指定接口的树选择框选项值
 * @param target 需要注入的原数组
 * @param field 注入字段名
 * @param api 接口方法
 * @param params 接口传入的参数
 * @param handleData 自定义处理数据的方法
 */
export async function injectCustomUpdateTreeOptions<T extends BaseModel>(
  target: Array<FormItemProps<T>>,
  field: string,
  api: Function,
  handleData: (data: Array<T>) => Array<T> = (data) => data,
  params: object = {},
): Promise<void> {
  const prop = target.find((val) => val.name == field)?.params as TreeSelectProps['treeData']
  if (prop) {
    const { data } = await api.apply(arguments, [params])
    // @ts-ignore
    prop.treeData = handleData ? handleData(data) : (data as any)
  }
}
